package aop
//添加到metaclass上的方法会被优先调用
//使用metaclass拦截,定义闭包
Dept.metaClass.invokeMethod ={ String name,params->
    //如果方法不是pre,就拦截执行pre过滤方法
    if(name !='pre'){
        //此处需要用delegate,this指本来,而不是dept类
        Dept.metaClass.getMetaMethod("pre").invoke(delegate,null)
    }
    if(Dept.metaClass.respondsTo(delegate,name).size()==0){//方法不存在
        //Employee.metaClass.invokeMethod(this,name,args) //会抛出MissMethod异常
        System.out.println "类中没有此方法"
    }else{
        Dept.metaClass.getMetaMethod(name).invoke(delegate,params)
    }
}
def dept = new Dept()
dept.login([name:"侯征"])
dept.layout()